#include "MirrorImageAlgorithm.h"
#include <QDebug>

/**
 * @brief 构造函数
 */
MirrorImageAlgorithm::MirrorImageAlgorithm(QObject *parent)
    : ImageProcessingAlgorithmBase(parent),
      m_horizontalMirror(false), m_verticalMirror(false),
      m_processed(false) // 初始为未处理状态
{

}

void MirrorImageAlgorithm::initialize()
{
    // 创建设置表单
    m_settingsForm = new MirrorImageSettingsForm();
    // 初始化设置表单
    m_settingsForm->setMirrorMode(m_horizontalMirror, m_verticalMirror);
    // 连接设置变化信号
    connect(m_settingsForm, &MirrorImageSettingsForm::settingsChanged, this, [this](){
        bool horizontal, vertical;
        m_settingsForm->mirrorMode(horizontal, vertical);
        setMirrorMode(horizontal, vertical);
    });
    // 发出注册widget信号
    emit registerAlgorithmWidget(algorithmName(), m_settingsForm, ":/images/images/Mirror.png");
}

/**
 * @brief 设置输入图像
 * @param input 输入图像
 */
void MirrorImageAlgorithm::setInputImage(const QString &imageId, const QImage &input)
{
    // 设置新图像时重置所有参数到默认值
    resetToDefaultParameters();
    m_imageId = imageId;
    m_inputImage = input;
}

QString MirrorImageAlgorithm::currentImageId() const
{
    return m_imageId;
}

/**
 * @brief 执行图像处理
 * 处理结果将通过imageProcessed信号输出
 */
void MirrorImageAlgorithm::processImage(const QString& parameters)
{
    if (m_inputImage.isNull()) {
        emit imageProcessed(m_imageId, QImage());
        return;
    }

    bool isPretreatment=false;
    quint32 mirrorType=parameters.toUInt();
    if(!parameters.isEmpty()&&mirrorType!=0)
    {
        m_horizontalMirror=mirrorType&0x01;
        m_verticalMirror=mirrorType&0x02;
        isPretreatment=true;
    }

    // 处理完成后标记为已处理
    m_processed = m_horizontalMirror|m_verticalMirror;
    
    if(!m_processed)
    {
       return;
    }
    QImage output = m_inputImage.copy();
    output = output.mirrored(m_horizontalMirror, m_verticalMirror);
    // 发送处理完成信号
    emit imageProcessed(m_imageId, output,isPretreatment);
}

/**
 * @brief 获取算法名称
 * @return 算法名称
 */
QString MirrorImageAlgorithm::algorithmName() const
{
    return QString("图像镜像");
}

/**
 * @brief 设置镜像模式
 * @param horizontal 水平镜像
 * @param vertical 垂直镜像
 */
void MirrorImageAlgorithm::setMirrorMode(bool horizontal, bool vertical)
{
    m_horizontalMirror = horizontal;
    m_verticalMirror = vertical;

    // 如果已经设置了输入图像，则立即处理
    if (!m_inputImage.isNull()) {
        processImage("");
    }
}

/**
 * @brief 获取当前镜像模式
 * @param horizontal 水平镜像标志
 * @param vertical 垂直镜像标志
 */
void MirrorImageAlgorithm::mirrorMode(bool &horizontal, bool &vertical) const
{
    horizontal = m_horizontalMirror;
    vertical = m_verticalMirror;
}

void MirrorImageAlgorithm::setProcessParameters(const QVariantMap &params)
{
    // 检查并设置处理状态参数
    if (params.contains("processed")) {
        m_processed = params["processed"].toBool();
    }
    
    // 检查并设置镜像模式参数
    if (params.contains("horizontalMirror") && params.contains("verticalMirror")) {
        bool horizontal = params["horizontalMirror"].toBool();
        bool vertical = params["verticalMirror"].toBool();
        setMirrorMode(horizontal, vertical);
    }
}

/**
 * @brief 恢复默认参数
 * 将算法的所有参数恢复到默认设置
 */
void MirrorImageAlgorithm::resetToDefaultParameters()
{
    // 恢复默认镜像模式
    m_horizontalMirror = false;
    m_verticalMirror = false;
    
    // 重置处理状态
    m_processed = false;
    
    // 清除设置的图像数据
    m_inputImage = QImage();
    m_imageId.clear();
    
    // 更新设置表单，但避免触发信号循环
    if (m_settingsForm) {
        // 断开信号连接，避免触发settingsChanged信号
        disconnect(m_settingsForm, &MirrorImageSettingsForm::settingsChanged, 0, 0);
        
        // 更新设置表单
        m_settingsForm->setMirrorMode(m_horizontalMirror, m_verticalMirror);
        
        // 重新连接信号
        connect(m_settingsForm, &MirrorImageSettingsForm::settingsChanged, this, [this](){
            bool horizontal, vertical;
            m_settingsForm->mirrorMode(horizontal, vertical);
            setMirrorMode(horizontal, vertical);
        });
    }
    
    qDebug() << "MirrorImageAlgorithm: Reset to default parameters and cleared image data";
}

/**
 * @brief 获取算法处理参数
 * @return 包含处理参数的QVariantMap
 */
QVariantMap MirrorImageAlgorithm::getProcessParameters() const
{
    QVariantMap params;
    params["algorithmName"] = algorithmName();
    params["imageId"] = m_imageId;
    params["processed"] = m_processed;
    params["horizontalMirror"] = m_horizontalMirror;
    params["verticalMirror"] = m_verticalMirror;
    return params;
}
